package cn.ronghuanet.base.config;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import javax.annotation.Resource;

@Configuration
public class CacheConfig extends CachingConfigurerSupport {

@Resource
private RedisConnectionFactory factory;

/**
 * 自定义生成SpringCache的key， 类名.方法名. ,缓存名需要添加时缓存
 */
@Override
@Bean
public KeyGenerator keyGenerator() {
    return (o, method, objects) -> {
        StringBuilder sb = new StringBuilder();
        sb.append(o.getClass().getName()).append(".");
        sb.append(method.getName()).append(".");
        for (Object obj : objects) {
            sb.append(obj.toString());
        }
        System.out.println("keyGenerator=" + sb.toString());
        return sb.toString();
    };
}

@Bean
@Override
public CacheResolver cacheResolver() {
    return new SimpleCacheResolver(cacheManager());
}

@Bean
@Override
public CacheErrorHandler errorHandler() {
    // 用于捕获从Cache中进行CRUD时的异常的回调处理器。
    return new SimpleCacheErrorHandler();
}
//缓存管理器
@Bean
@Override
public CacheManager cacheManager() {
    RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                    .disableCachingNullValues() //不允许空值
                    .serializeValuesWith(RedisSerializationContext.SerializationPair
                                         //值使用JSON序列化
                                         .fromSerializer(new GenericJackson2JsonRedisSerializer()));
    
    return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
}
} 